package com.comprehensive.personalfile.service;

import com.comprehensive.common.dto.FolderFlieInfo;
import com.comprehensive.common.dto.PageResponse;
import com.comprehensive.common.po.FileInfo;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

public interface FileService {
    /**
     * 获取文件信息列表-分页查询
     * @param pageNum
     * @param pageSize
     * @return
     */
    PageResponse<FileInfo> listPage(int pageNum, int pageSize);
    /**
     * 上传文件
     * @param file 上传的文件
     * @return 文件信息
     * @throws IOException IO异常
     */
    FileInfo uploadFile(MultipartFile file) throws IOException;

    /**
     * 下载文件
     * @param fileId 文件ID
     * @param response 响应对象
     * @throws IOException IO异常
     */
    void downloadFile(String fileId, HttpServletResponse response) throws IOException;

    /**
     * 列出目录下的文件信息
     * @param directoryPath 目录路径
     * @return 文件信息列表
     * @throws IOException IO异常
     */
    List<FolderFlieInfo> listFiles(String directoryPath) throws IOException;

    /**
     * 流式读取文件内容
     * @param filePath 文件路径
     * @return 文件输入流
     * @throws IOException IO异常
     */
    InputStream readFileAsStream(String filePath) throws IOException;

    /**
     * 上传文件分片
     * @param uploadId 上传唯一标识
     * @param chunkIndex 分片索引
     * @param totalChunks 总分片数
     * @param fileName 原始文件名
     * @param chunkFile 分片文件
     * @return 文件信息
     * @throws IOException IO异常
     */
    FileInfo uploadChunk(String uploadId, int chunkIndex, int totalChunks, String fileName, MultipartFile chunkFile) throws IOException;

    /**
     * 合并文件分片
     * @param uploadId 上传唯一标识
     * @param fileName 原始文件名
     * @return 文件信息
     * @throws IOException IO异常
     */
    FileInfo mergeChunks(String uploadId, String fileName) throws IOException;

    /**
     * 查询已上传的分片索引
     * @param uploadId 上传唯一标识
     * @param fileName 文件名
     * @return 已上传的分片索引列表
     * @throws IOException IO异常
     */
    List<Integer> getUploadedChunks(String uploadId, String fileName) throws IOException;

    /**
     * 获取 Markdown 文件的内容
     *
     * @param filePath Markdown 文件的路径，用于指定要读取的文件位置
     * @return 返回指定路径下 Markdown 文件的内容，以字符串形式呈现
     * @throws IOException 当读取文件过程中出现 I/O 错误时抛出该异常，例如文件不存在、无读取权限等
     */
    String getMarkdownContent(String filePath) throws IOException;
    /**
     * 将指定内容保存到 Markdown 文件中。
     * 如果文件不存在，会创建新文件；如果文件已存在，会覆盖原文件内容。
     *
     * @param filePath Markdown 文件的路径，用于指定要保存内容的文件位置。
     * @param content  需要保存到文件中的内容，以字符串形式提供。
     * @throws IOException 当写入文件过程中出现 I/O 错误时抛出该异常，
     *                     例如文件路径无效、没有写入权限、磁盘空间不足等。
     */
    void saveMarkdownContent(String filePath, String content) throws IOException;
    /**
     * 解析磁力链接，获取包含的文件信息。
     *
     * @param magnetLink 磁力链接字符串，用于指定要解析的磁力链接。
     * @return 返回一个包含文件信息的 Map 对象，其中键为文件名，值为文件大小。
     *         如果解析过程中出现错误，将返回 null。
     */
    Map<String,Object> getMagnetLinkInfoByUrl(String magnetLink);
    /**
     * 根据磁力链接下载文件。
     *
     * @param magnetLink 磁力链接字符串，用于指定要下载的文件。
     * @param selectDownloadIndex 要下载的文件索引数组，用于指定要下载的文件。
     * @throws InterruptedException 当下载过程中出现中断异常时抛出该异常，
     *                              例如用户取消下载操作等。
     */
    void downloadMagnetLink(String magnetLink,int selectDownloadIndex) throws InterruptedException;

}